package menu.menu;

import comunicacion.Comunicacion;
import java.util.ArrayList;
import java.util.Collection;
import menu.mensajero.Mensajero;

/**
 * Clase que representa el menú en el tablet.
 * @author JSR
 * @version $Id: Menu.java 66 2010-10-06 21:11:27Z lopezandres2002@hotmail.com $
 */
public class Menu
{
    //---------------------------------------
    // Atributos
    //---------------------------------------

    /**
     * Inicializacion de la instancia del menu. Patrón singleton.
     */
    private static Menu INSTANCIA = new Menu();
    /**
     * La bandeja que contiene los elementos a pedir
     */
    private Bandeja bandeja;
    /**
     * Los items del menú, lo que se ofrece
     */
    private Collection<IItem> items;
    /**
     * Clase para manejar la comunicación
     */
    private static Comunicacion comunicacion;
    /**
     * Clase para manejar el chat entre mesas
     */
    private Mensajero mensajero;
    /**
     * Identificador de la mesa a la que representa este menú
     */
    private static String IDMesa;

    public boolean visibilidadChat;
    //---------------------------------------
    // Constructor
    //---------------------------------------

    public Menu()
    {
        items = new ArrayList<IItem>();
        bandeja = new Bandeja();
        comunicacion = new Comunicacion();
        mensajero = new Mensajero(comunicacion);//??
        visibilidadChat = false;
        crearMenuDePrueba();
    }
    //---------------------------------------
    // Getters y Setters
    //---------------------------------------

    /**
     * Metodo que devuelve los items en el menú
     * @return the items
     */
    public Collection<IItem> getItems()
    {
        return items;
    }

    /**
     * Metodo que inicia los items del menú
     * @param items the items to set
     */
    public void setItems( Collection<IItem> items )
    {
        this.items = items;
    }

    /**
     * Metodo que devuelve la instancia del menú para ser usada en la interfaz. Patrón singleton
     * @return INSTANCIA - instancia de menu
     */
    public static Menu getInstance()
    {
        return INSTANCIA;
    }



    //---------------------------------------
    // Métodos
    //---------------------------------------
    /**
     * Metodo que permite agregar un item a la bandeja del menú.<br>
     * <b>Pre:</b> El item existe en el menú.<br>
     * <b>Pos:</b> El item queda agregado a la bandeja
     * @param nItem - Item que va a ser agregado al pedido
     */
    public void agregarItemABandeja( IItem nItem )
    {
        bandeja.agregarItemABandeja( nItem );
    }

    /**
     * Metodo que permite eliminar un item de la bandeja del menú
     * @param nItem - Item a eliminar del pedido
     */
    public void eliminarItemDeBandeja( IItem nItem )
    {
        bandeja.eliminarItemDeBandeja( nItem );
    }

    /**
     * Metodo que devuelve los items encontrados en la bandeja
     * @return
     */
    public Collection<IItem> getBandeja()
    {
        return bandeja.getItemasAPedir();
    }

    /**
     * Metodo para crear un menù ficticio para propositos de desarrollo
     */
    private void crearMenuDePrueba()
    {
        Collection<Ingrediente> ingredientesLasagna = new ArrayList<Ingrediente>();
        Ingrediente pollo = new Ingrediente( "Pollo", "Carne de pollo fresca" );
        ingredientesLasagna.add( pollo );
        Ingrediente pasta = new Ingrediente( "Pasta", "Pasta italiana" );
        ingredientesLasagna.add( pasta );
        Ingrediente albahaca = new Ingrediente( "Albahaca", "Planta" );
        ingredientesLasagna.add( albahaca );
        IItem lasagna = new Plato( "Lasagna de Pollo", "Capas de pasta fresca con pollo y verduras.", ingredientesLasagna, "El plato viene con un acompañamiento de pan", 10000, 11600, Constantes.TiposItem.P_PLATO_FUERTE );

        Collection<Ingrediente> ingredientesTorta = new ArrayList<Ingrediente>();
        Ingrediente harina = new Ingrediente( "Harina", "Harina de trigo" );
        ingredientesTorta.add( harina );
        Ingrediente chocolate = new Ingrediente( "Chocolate", "Chocolate oscuro" );
        ingredientesTorta.add( chocolate );
        Ingrediente fresa = new Ingrediente( "Fresa", "Fresas frescas" );
        ingredientesTorta.add( fresa );
        IItem torta = new Plato( "Torta de chocolate", "Torta de chocolate con fresas encima.", ingredientesTorta, "Preparado con SPLENDA", 5000, 5800, Constantes.TiposItem.P_POSTRE );

        Collection<Ingrediente> ingredientesGaseosa = new ArrayList<Ingrediente>();
        IItem cola = new Bebida( "Coca Cola", "Bebida carbonatada", ingredientesGaseosa, "", 1000, 1160, Constantes.TiposItem.B_NO_ALCOHOLICA );

        items.add( lasagna );
        items.add( torta );
        items.add( cola );
    }

    public int darVisibilidadChat()
    {
        return visibilidadChat ? 1 : 0;
    }

    public void cambiarVisibilidadChat()
    {
        visibilidadChat = !visibilidadChat;
    }

    //---------------------------------------
    // Métodos de Comunicación
    //---------------------------------------
    /**
     * Metodo que permite pedir la cuenta de la mesa según el protocolo
     * @param tipoPago - La forma de pago para cancelar la cuenta
     */
    public void pedirCuenta( Constantes.TipoPago tipoPago )
    {
        comunicacion.pedirCuenta( null, tipoPago );
    }

    /**
     * Metodo que permite enviar una sugerencia según el protocolo
     * @param autor - Persona que redacta la sugerencia
     * @param email - Email de contacto de la persona que redacta la sugerencia
     * @param sugerencia - Contenido de la sugerencia
     */
    public void enviarSugerencia( String autor, String email, String sugerencia )
    {
        comunicacion.enviarSugerencia( autor, email, IDMesa, sugerencia );
    }

    /**
     * Metodo que permite llamar un mesero a la mesasegún el protocolo
     */
    public static void llamarMesero()
    {
        comunicacion.llamarMesero( IDMesa );
    }
}
